﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;

namespace Quaack
{
    public class Bericht
    {
        // Vars
        public Gebruiker Zender { get; set; }
        public Gebruiker Ontvanger { get; set; }
        public string Inhoud { get; set; }
        public int BerichtID { get; set; }
        public Bericht HoofdBericht { get; set; }
        public DateTime BerichtDatum { get; set; }
        public bool Verwijderd { get; set; }
        public Gebruiker VerwijderdDoor { get; set; }

        // Interne functies
        /// <summary>
        /// Probeer een cast uit te voeren op de opgegeven datum
        /// </summary>
        /// <param name="datum">DateTime object</param>
        /// <returns>Indien de cast niet succesvol is, wordt de minvalue teruggegeven</returns>
        private DateTime ConverteerDatum(Object datum)
        {
            try
            {
                return (DateTime)datum;
            }
            catch
            {
                return DateTime.MinValue;
            }
        }

        // Publiekelijke functies
        /// <summary>
        /// Met deze functie kan een bericht worden geplaatst
        /// </summary>
        public void BerichtPlaatsen()
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.messageTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            messageAdapter.BerichtPlaatsen(BerichtDatum, Zender.ProfielID, Ontvanger.ProfielID, Inhoud);
        }

        /// <summary>
        /// Deze functie geeft een lijst met berichten terug die bij de opgegeven gebruiker horen
        /// </summary>
        /// <param name="gebruiker"></param>
        /// <returns></returns>
        public List<Bericht> BerichtenOphalen(Gebruiker ontvanger)
        {
            // Maak een nieuwe instantie van de profileTableAdapter en ListView aan
            DataLayer.quaackTableAdapters.messageTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageTableAdapter();
            List<Bericht> berichtenLijst = new List<Bericht>();

            // Voer de statements uit met de opgegeven parameters
            DataTable dtBerichten = messageAdapter.BerichtenBekijken(ontvanger.ProfielID);

            // Voeg de gegevens van alle reageerders en hun berichten toe aan de lijst
            for (int i = 0; i < dtBerichten.Rows.Count; i++)
            {
                // Maak een nieuwe instantie van een berichtobject aan en voeg een HoofdBericht object toe indien aanwezig
                Bericht bericht = new Bericht();
                if (dtBerichten.Rows[i]["parentmessid"] != DBNull.Value)
                {
                    bericht.HoofdBericht = new Bericht().HoofdberichtOphalen((int)dtBerichten.Rows[i]["parentmessid"]);
                }
                else
                {
                    // Maak een nieuwe instantie voor het hoofdbericht
                    Bericht hoofdbericht = new Bericht();
                    hoofdbericht.BerichtID = -1;

                    // Koppel het hoofdbericht aan het bericht object
                    bericht.HoofdBericht = hoofdbericht;
                }

                bericht.BerichtID = (int)dtBerichten.Rows[i]["messid"];
                bericht.BerichtDatum = (DateTime)dtBerichten.Rows[i]["messdatetime"];
                bericht.Inhoud = (string)dtBerichten.Rows[i]["message"];
                bericht.Ontvanger = ontvanger;
                bericht.Verwijderd = (bool)dtBerichten.Rows[i]["removed"];

                if (dtBerichten.Rows[i]["removedby"] != DBNull.Value)
                {
                    bericht.VerwijderdDoor = new Gebruiker().GebruikerOpvragen((int)dtBerichten.Rows[i]["removedby"]);
                }

                bericht.Zender = new Bericht().ZenderOpvragen(bericht.BerichtID);

                // Voeg het bericht toe aan del lijst
                berichtenLijst.Add(bericht);
            }

            return berichtenLijst;
        }

        /// <summary>
        /// Deze functie verwijdert een bericht op basis van het opgegeven berichtID
        /// </summary>
        /// <param name="berichtID"></param>
        public void BerichtVerwijderen(int berichtID, Gebruiker gebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.messageTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageTableAdapter();

            // Verwijder het bericht
            messageAdapter.BerichtVerwijderen(gebruiker.ProfielID, berichtID);
        }

        /// <summary>
        /// Deze functie plaatst een reactie op basis van het opgegeven berichtID
        /// </summary>
        /// <param name="berichtID"></param>
        public void ReactiePlaatsen(int berichtID)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.messageTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            messageAdapter.ReactiePlaatsen(BerichtDatum, Zender.ProfielID, Ontvanger.ProfielID, berichtID, Inhoud);
        }

        /// <summary>
        /// Deze functie haalt de zender van het opgegeven bericht op
        /// </summary>
        /// <param name="berichtID"></param>
        /// <returns>Een gebruikersobject</returns>
        public Gebruiker ZenderOpvragen(int berichtID)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.messageTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageTableAdapter();

            // Voer een query uit naar de verwijderaar en geef een gebruikersobject hiervan terug
            return new Gebruiker().GebruikerOpvragen((int)(messageAdapter.ZenderOpvragen(berichtID)));
        }

        /// <summary>
        /// Deze functie haalt de verwijderaar van het opgegeven bericht op
        /// </summary>
        /// <param name="berichtID"></param>
        /// <returns>Een gebruikersobject</returns>
        public Gebruiker VerwijderaarOpvragen(int berichtID)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.messageTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageTableAdapter();

            // Voer een query uit naar de verwijderaar en geef een gebruikersobject hiervan terug
            return new Gebruiker().GebruikerOpvragen((int)messageAdapter.VerwijderaarOpvragen(berichtID));
        }

        /// <summary>
        /// Deze functie haalt indien aanwezig het hoofdbericht op van het opgegeven bericht
        /// </summary>
        /// <param name="berichtID">Het berichtID van het bericht waarvan het hoofdbericht moet worden bepaald</param>
        /// <returns>Het hoofdbericht</returns>
        public Bericht HoofdberichtOphalen(int berichtID)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.messageTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageTableAdapter();
            
            // Voer de statements uit met de opgegeven parameters
            DataTable dtBerichten = messageAdapter.HoofdberichtOphalen(berichtID);

            // Zet de noodzakelijke attributen in het object
            Bericht bericht = new Bericht();
            bericht.BerichtDatum = ConverteerDatum(dtBerichten.Rows[0]["messdatetime"]);
            bericht.BerichtID = berichtID;
            bericht.Inhoud = (string)dtBerichten.Rows[0]["message"];
            bericht.Verwijderd = (bool)dtBerichten.Rows[0]["removed"];

            // Stuur het bericht terug
            return bericht;
        }

        /// <summary>
        /// Deze functie haalt alle reageerders op van de opgegeven gebruiker.
        /// </summary>
        /// <param name="ontvanger">De ontvanger waarvan alle reageerders op moeten worden gehaald.</param>
        /// <returns>Een gebruikerslijst met rageerders.</returns>
        public List<Gebruiker> ReageerdersOphalen(Gebruiker ontvanger)
        {
            // Maak een nieuwe instantie van de profileTableAdapter en ListView aan
            DataLayer.quaackTableAdapters.messageReageerdersTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageReageerdersTableAdapter();
            List<Gebruiker> reageerdersLijst = new List<Gebruiker>();

            // Voer de statements uit met de opgegeven parameters
            DataTable dtBerichten = messageAdapter.ReageerdersOphalen(ontvanger.ProfielID);

            // Haal het gebruikersobject op en voeg deze toe aan de lijst met reageerders
            for (int i = 0; i < dtBerichten.Rows.Count; i++)
            {
                reageerdersLijst.Add(new Gebruiker().GebruikerOpvragen((int)dtBerichten.Rows[i]["sender"]));
            }

            // Geef de lijst met reageerders terug
            return reageerdersLijst;
        }

        /// <summary>
        /// Deze functie haalt alle gebruikers op waarop de opgegeven gebruiker heeft gereageerd.
        /// </summary>
        /// <param name="ontvanger">De ontvanger waarvan alle reageerders op moeten worden gehaald.</param>
        /// <returns>Een gebruikerslijst met gebruikers waarop de opgegeven gebruiker heeft gereageerd.</returns>
        public List<Gebruiker> OntvangersOphalen(Gebruiker ontvanger)
        {
            // Maak een nieuwe instantie van de profileTableAdapter en ListView aan
            DataLayer.quaackTableAdapters.messageOntvangersTableAdapter messageAdapter = new DataLayer.quaackTableAdapters.messageOntvangersTableAdapter();
            List<Gebruiker> reageerdersLijst = new List<Gebruiker>();

            // Voer de statements uit met de opgegeven parameters
            DataTable dtBerichten = messageAdapter.OntvangersOphalen(ontvanger.ProfielID);

            // Haal het gebruikersobject op en voeg deze toe aan de lijst met ontvangers
            for (int i = 0; i < dtBerichten.Rows.Count; i++)
            {
                reageerdersLijst.Add(new Gebruiker().GebruikerOpvragen((int)dtBerichten.Rows[i]["receiver"]));
            }

            // Geef de lijst met reageerders terug
            return reageerdersLijst;
        }
    }
}